home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib03.dsk / MUSIC RETRIEVAL SYSTEM.bas < prev    next >
BASIC Source File  |  2023-02-26  |  22KB  |  423 lines

  1. 10  REM  ----------------------
  2. 15  REM  -  MUSIC   RETRIEVAL -
  3. 20  REM  -   SYSTEM VER. 3.0  -
  4. 25  REM  -  BY: RUDY A. GUY   -
  5. 30  REM  ----------------------
  6. 35  REM  SET UP VARIABLES
  7. 40  REM  : ENTER PRINTER DRIVER ROUTINE HERE
  8. 45  TEXT : HOME 
  9. 50  FOR I = 1 TO 4: READ ME$(I): NEXT 
  10. 55  DEF  FN A(I) = (MI(I) *60) +SE(I)
  11. 60  DEF  FN TM(I) =  INT(TT/60)
  12. 65  DEF  FN TS(I) = TT - INT(TT/60) *60
  13. 70  DIM ST$(14),MI(14),SE(14),SO$(14),M(14),S(14),RE$(311),LN(311)
  14. 75 D$ =  CHR$(13) + CHR$(4)
  15. 80 O$ = D$ +"OPEN MUSIC INDEX,L8":R$ = D$ +"READ MUSIC INDEX,R":W$ = D$ +"WRITE MUSIC INDEX,R":C$ = D$ +"CLOSE MUSIC INDEX"
  16. 85 O1$ = D$ +"OPEN ALBUMS,L82":R1$ = D$ +"READ ALBUMS,R":W1$ = D$ +"WRITE ALBUMS,R":C1$ = D$ +"CLOSE ALBUMS"
  17. 90 O2$ = D$ +"OPEN SONGS,L670":R2$ = D$ +"READ SONGS,R":W2$ = D$ +"WRITE SONGS,R":C2$ = D$ +"CLOSE SONGS"
  18. 95  ONERR  GOTO 2015
  19. 100  GOSUB 1960
  20. 105  ON YN GOSUB 120,480,925,1105,1300,2005
  21. 110  CLEAR : GOTO 45
  22. 115  REM  ADD RECORD TO FILE
  23. 120  GOSUB 1840
  24. 125  IF AR < = 0  THEN NU = NU +1: GOTO 135
  25. 130 NU = AR(AR)
  26. 135  VTAB 3
  27. 140  PRINT "(1=ALBUM,2=8-TRACK,3=CASS.,4=REEL/REEL)"
  28. 145  IF FL = 1  THEN 155
  29. 150  VTAB 2
  30. 155  INVERSE : INPUT "MEDIA :";ME$: NORMAL 
  31. 160  IF ME$ <"1"  OR ME$ >"4"  THEN  CALL  -998: CALL  -868: GOTO 155
  32. 165  IF FL = 1  THEN  RETURN 
  33. 170  VTAB 5
  34. 175  INVERSE : PRINT "ALBUM NAME :": NORMAL : PRINT "(MAX. LENGTH IS  40)": INPUT "";AL$
  35. 180  IF  LEN(AL$) <1  OR  LEN(AL$) >40  THEN  CALL  -998: CALL  -998: CALL  -998: CALL  -958: GOTO 175
  36. 185  IF  LEN(AL$) <40  THEN  GOSUB 1880
  37. 190  IF FL = 1  THEN  RETURN 
  38. 195  VTAB 10
  39. 200  INVERSE : PRINT "ARTIST :": NORMAL : PRINT "(MAX. LENGTH IS 30)"
  40. 205  IF FL = 1  THEN  VTAB 21: GOTO 215
  41. 210  VTAB 10
  42. 215  HTAB 9: INPUT "";AR$
  43. 220  IF  LEN(AR$) <1  OR  LEN(AR$) >30  THEN  CALL  -998: CALL  -958: GOTO 200
  44. 225  IF  LEN(AR$) <30  THEN  GOSUB 1890
  45. 230  IF FL = 1  THEN  RETURN 
  46. 235  HOME : PRINT "ALBUM :"; LEFT$(AL$,32): PRINT "ARTIST:";AR$: PRINT "MEDIA :";ME$( VAL(ME$))
  47. 240  PRINT "----------------------------------------": POKE 34,4
  48. 245  VTAB 12: INPUT "NUMBER OF SONGS (MAX. 14) :";S$:S =  VAL(S$)
  49. 250  IF S <1  OR S >14  THEN  CALL  -998: CALL  -958: GOTO 245
  50. 255  HOME : VTAB 6
  51. 260  FOR I = 1 TO S
  52. 265  PRINT "SONG TITLE #";I;" (MAX. LENGTH IS 40)"
  53. 270  INPUT "";ST$(I)
  54. 275  IF  LEN(ST$(I)) >40  OR ST$(I) = ""  THEN  HOME : GOTO 265
  55. 280  INPUT "SONG LENGTH (MM,SS) :";MI(I),SE(I)
  56. 285  IF SE(I) >60  OR SE(I) <0  THEN  CALL  -998: CALL  -958: GOTO 280
  57. 290 LE = LE + FN A(I)
  58. 295  IF I/4 =  INT(I/4)  THEN  HOME 
  59. 300  PRINT : NEXT 
  60. 305 LE$ =  STR$(LE)
  61. 310  IF  LEN(LE$) <4  THEN  GOSUB 1900
  62. 315 S$ =  STR$(S): IF  LEN(S$) <2  THEN S$ = "0" +S$
  63. 320  REM  WRITE FILES TO DISK
  64. 325  IF AR > = 1  THEN 395
  65. 330  PRINT O$: PRINT W$;0: PRINT NU: PRINT C$: PRINT O$: PRINT W$;NU: PRINT NU: PRINT C$
  66. 335 RE$ = ME$ +LE$ +S$ +AL$ +AR$ + STR$(NU)
  67. 340  PRINT O1$: PRINT W1$;NU: PRINT RE$: PRINT C1$
  68. 345  PRINT O2$: PRINT W2$;NU: PRINT AR$: PRINT S
  69. 350  FOR I = 1 TO S
  70. 355  PRINT ST$(I): PRINT MI(I): PRINT SE(I)
  71. 360  NEXT 
  72. 365  PRINT C2$
  73. 370  IF FL = 1  THEN FL = 0: RETURN 
  74. 375  TEXT : HOME : VTAB 12: PRINT "DO YOU WISH TO ADD ANOTHER RECORD ?";: GET YN$: PRINT 
  75. 380  IF YN$ = "Y"  THEN  FOR I = 1 TO S:MI(I) = 0:SE(I) = 0: NEXT :LE = 0: HOME : GOTO 120
  76. 385  IF EF = 1  THEN  GOTO 110
  77. 390  RETURN 
  78. 395  REM   WRITE REC. TO DISK (RE-REPLACING A DELETED RECORD)
  79. 400  PRINT O$: PRINT W$;AR(AR +1): PRINT AR(AR): PRINT C$
  80. 405 RE$ = ME$ +LE$ +S$ +AL$ +AR$ + STR$(AR(AR +1))
  81. 410  PRINT O1$: PRINT W1$;NU: PRINT RE$: PRINT C1$
  82. 415  PRINT O2$: PRINT W2$;AR(AR +1): PRINT AR$: PRINT S
  83. 420  FOR I = 1 TO S
  84. 425  PRINT ST$(I): PRINT MI(I): PRINT SE(I)
  85. 430  NEXT 
  86. 435  FOR I = 1 TO (AR *2) -2
  87. 440 AR(I) = AR(I +2)
  88. 445  NEXT 
  89. 450 AR = AR -1
  90. 455  PRINT O2$: PRINT W2$;0: PRINT AR: FOR I = 1 TO (AR *2)
  91. 460  PRINT AR(I)
  92. 465  NEXT : PRINT C2$
  93. 470  IF FL = 1  THEN FL = 0: RETURN 
  94. 475  GOTO 375
  95. 480  REM  SEARCH/CHANGE/DELETE
  96. 485  GOSUB 1610
  97. 490  FOR I = 1 TO  LEN(AL$)
  98. 495  IF I >25  AND  MID$ (AL$,I,1) = " "  THEN B$ =  MID$ (AL$,1,I -1):B1$ =  MID$ (AL$,I +1, LEN(AL$) -I): GOTO 505
  99. 500  NEXT 
  100. 505  REM  PRINT RECORD TO SCREEN
  101. 510  TEXT : HOME 
  102. 515  INVERSE : PRINT "TITLE :";: NORMAL : PRINT " "B$
  103. 520  PRINT  TAB( 9)B1$
  104. 525  INVERSE : PRINT "ARTIST:";: NORMAL : PRINT " "AR$
  105. 530  VTAB  PEEK(37) +2: INVERSE : PRINT "MEDIA :";: NORMAL : PRINT " "ME$( VAL(ME$));
  106. 535  HTAB 18: INVERSE : PRINT "LENGTH :";: NORMAL 
  107. 540  PRINT " " FN TM(FI);" MIN.";:X$ =  STR$( FN TS(FI)): IF  LEN(X$) <2  THEN X$ = "0" +X$
  108. 545  PRINT X$;" SEC.": VTAB 6
  109. 550  PRINT "========================================";
  110. 555  FOR SO = 1 TO S: PRINT  LEFT$(ST$(SO),34);: IF  LEN( STR$(MI(SO))) <2  THEN  HTAB 37: PRINT MI(SO);":";: GOTO 560
  111. 557  HTAB 36: PRINT MI(SO);":";
  112. 560 X$ =  STR$(SE(SO)): IF  LEN(X$) <2  THEN X$ = "0" +X$
  113. 565  PRINT X$;
  114. 570  NEXT 
  115. 575  VTAB 21: PRINT "========================================";
  116. 580  VTAB 21: PRINT "========================================";
  117. 585  VTAB 22: PRINT "<C>HANGE": PRINT "<D>ELETE": PRINT "<R>ETURN TO MENU";
  118. 590 X =  PEEK( -16384)
  119. 595  IF X = 195  THEN 615
  120. 600  IF X = 196  THEN 840
  121. 605  IF X = 210  THEN  POKE  -16368,0: RETURN 
  122. 610  GOTO 590
  123. 615  REM  CHANGE DATA IN FILE
  124. 620  POKE  -16368,0
  125. 625  HOME : INVERSE : PRINT "________________CHANGE__________________";: NORMAL : POKE 34,1
  126. 630  PRINT "(1) " LEFT$(AL$,35): PRINT "(2) ";AR$: PRINT "(3) ";ME$( VAL(ME$)): INVERSE : PRINT "                SONGS                   ";: NORMAL 
  127. 635  FOR J = 1 TO S: PRINT "(";J +3;") "; LEFT$(ST$(J),34): NEXT : VTAB 20: INVERSE : PRINT "                                        ";: NORMAL 
  128. 640  IF AD = 1  THEN 675
  129. 645  VTAB 21: PRINT "ENTER THE NUMBER TO CHANGE :": INVERSE : PRINT "'0' TO QUIT": NORMAL : VTAB 21: HTAB 29: INPUT "";CH$:CH =  VAL(CH$)
  130. 650  IF CH <0  OR CH >S +3  THEN 645
  131. 655  VTAB 21: CALL  -958
  132. 660  IF CH = 0  THEN 675
  133. 665 FL = 1: ON CH GOTO 755,775,795
  134. 670  GOTO 810
  135. 675  VTAB 21: CALL  -958: IF S = 14  THEN 690
  136. 680  PRINT "DO YOU WISH TO ADD ANOTHER SONG ?";: GET YN$: PRINT : IF YN$ = "N"  THEN 690
  137. 685  VTAB 21:FL = 1: CALL  -958:S = S +1:CH = S:AD = 1: VTAB 21: PRINT "SONG TITLE #";CH;" (MAX. LENGTH IS 40)": GOTO 815
  138. 690  IF FL = 0  THEN  RETURN 
  139. 695  POKE 34,23: HOME 
  140. 700 LE = 0: FOR I = 1 TO S:LE = LE + FN A(I): NEXT :: REM  :NEW RECORDING TIME
  141. 705 LE$ =  STR$(LE): IF  LEN(LE$) <4  THEN  GOSUB 1900
  142. 710 S$ =  STR$(S): IF  LEN(S$) <2  THEN S$ = "0" +S$
  143. 715 RE$ = ME$ +LE$ +S$ +AL$ +AR$ + STR$(LN)
  144. 720  PRINT O1$: PRINT W1$;AL: PRINT RE$: PRINT C1$
  145. 725  PRINT O2$: PRINT W2$;LN: PRINT AR$: PRINT S
  146. 730  FOR I = 1 TO S
  147. 735  PRINT ST$(I): PRINT MI(I): PRINT SE(I)
  148. 740  NEXT : PRINT C2$
  149. 745  TEXT : HOME : VTAB 12: PRINT "DO YOU WANT TO CHANGE ANOTHER RECORD ?";: GET YN$: PRINT : IF YN$ = "Y"  THEN FL = 0: HOME : GOTO 480
  150. 750  RETURN 
  151. 755  VTAB 21: INVERSE : PRINT "ALBUM NAME :": NORMAL : PRINT "(MAX. LENGTH IS  40)": INPUT "";AL$
  152. 760  IF  LEN(AL$) >40  THEN  CALL  -998: CALL  -998: CALL  -958: GOTO 755
  153. 765  IF  LEN(AL$) <40  THEN  GOSUB 1880
  154. 770  HOME : GOTO 630
  155. 775  VTAB 21: INVERSE : PRINT "ARTIST :": NORMAL : PRINT "(MAX. LENGTH IS 30)": VTAB 21: HTAB 9: INPUT "";AR$
  156. 780  IF  LEN(AR$) >30  THEN  CALL  -998: CALL  -998: CALL  -958: GOTO 775
  157. 785  IF  LEN(AR$) <30  THEN  GOSUB 1890
  158. 790  HOME : GOTO 805
  159. 795  VTAB 22: PRINT "(1=ALBUM,2=8-TRACK,3=CASS.,4=REEL/REEL)": VTAB 21: INVERSE : INPUT "MEDIA :";ME$: NORMAL 
  160. 800  IF ME$ <"1"  OR ME$ >"4"  THEN 795
  161. 805  HOME : GOTO 630
  162. 810  VTAB 21:CH = CH -3: PRINT "SONG TITLE #";CH;" (MAX. LENGTH IS 40)"
  163. 815  INPUT "";ST$(CH)
  164. 820  IF  LEN(ST$(CH)) >40  OR ST$(CH) = ""  THEN  HOME : GOTO 810
  165. 825  INPUT "SONG LENGTH (MM,SS) :";MI(CH),SE(CH)
  166. 830  IF SE(CH) >60  OR SE(CH) <0  THEN  CALL  -998: CALL  -958: GOTO 825
  167. 835  HOME : GOTO 630
  168. 840  REM  DELETE A RECORD
  169. 845  POKE  -16368,0
  170. 850  POKE 34,21: HOME 
  171. 855  PRINT "TYPE 'DEL' TO DELETE THIS RECORD.       <RETURN> TO GO BACK TO MENU.": VTAB 22: HTAB 35: INPUT YN$
  172. 860  IF YN$ < >"DEL"  THEN 110
  173. 865  IF AL < = 0  THEN  PRINT O$: PRINT R$;FI: INPUT AL: PRINT C$
  174. 870  PRINT O2$: PRINT R2$;0: INPUT AR: IF AR = 0  THEN 880
  175. 875  FOR I = 1 TO AR *2: INPUT AR(I): NEXT 
  176. 880 AR = AR +1:AR((AR *2) -1) = AL:AR(AR *2) = FI
  177. 885  PRINT W2$;0: PRINT AR: IF AR = 0  THEN 895
  178. 890  FOR I = 1 TO AR *2: PRINT AR(I): NEXT 
  179. 895  PRINT W2$;FI: PRINT 0: PRINT C2$
  180. 900  PRINT O1$: PRINT W1$;AL: PRINT 0: PRINT C1$
  181. 905  TEXT : HOME : VTAB 9: PRINT AL$;"HAS BEEN DELETED."
  182. 910  VTAB 13: PRINT "DO YOU WANT TO DELETE ANOTHER RECORD ?";: GET YN$: PRINT : IF YN$ = "N"  THEN 110
  183. 915 AR = 0:AL = 0:FI = 0: HOME : GOTO 480
  184. 920  REM  LIST OUT ROUTINE
  185. 925  VTAB 12: PRINT "DO YOU WANT A PRINT OUT ?";: GET YN$: PRINT : IF YN$ = "N"  THEN 980
  186. 930 A(1) = 0:A(2) = 31:A(3) = 72:A(4) = 84:PR = 1: PRINT  CHR$(4);"PR#2": PRINT  CHR$(30): PRINT 
  187. 935  PRINT O$: PRINT R$;0: INPUT NU: PRINT C$
  188. 940  PRINT O1$: PRINT "ARTIST                         TITLE                                    MEDIA        TIME ": FOR I = 1 TO 90: PRINT "-";: NEXT : FOR I = 1 TO NU: PRINT R1$;I
  189. 945  INPUT RE$: IF RE$ = "0"  THEN 970
  190. 950  GOSUB 1095
  191. 955  POKE 36,A(1): PRINT AR$;: POKE 36,A(2): PRINT AL$;: POKE 36,A(3): PRINT ME$( VAL(ME$));: POKE 36,A(4): PRINT  FN TM(I)":";:X$ =  STR$( FN TS(I))
  192. 960  IF  LEN(X$) <2  THEN X$ = "0" +X$
  193. 965  PRINT X$
  194. 970  NEXT : PRINT C1$: PRINT  CHR$(4);"PR#0"
  195. 975  HOME : GOTO 110
  196. 980  REM  PRINT TO SCREEN
  197. 985  PRINT O$: PRINT R$;0: INPUT NU: PRINT C$
  198. 990  PRINT O1$: HOME : FOR I = 1 TO NU: PRINT R1$;I
  199. 995  INPUT RE$: IF RE$ = "0"  THEN 1075
  200. 1000 CO = CO +1
  201. 1005  GOSUB 1095
  202. 1010  PRINT "RECORD #";: NORMAL : PRINT I
  203. 1015  FOR J = 1 TO  LEN(AL$)
  204. 1020  IF J >25  AND  MID$ (AL$,J,1) = " "  THEN B$ =  MID$ (AL$,1,J -1):B1$ =  MID$ (AL$,J +1, LEN(AL$) -J):J = 40: GOTO 1030
  205. 1025  NEXT 
  206. 1030  INVERSE : PRINT "TITLE :";: NORMAL : PRINT " "B$
  207. 1035  PRINT  TAB( 9)B1$
  208. 1040  INVERSE : PRINT "ARTIST:";: NORMAL : PRINT " "AR$
  209. 1045  VTAB  PEEK(37) +2: INVERSE : PRINT "MEDIA :";: NORMAL : PRINT " "ME$( VAL(ME$));
  210. 1050  HTAB 18: INVERSE : PRINT "LENGTH :";: NORMAL 
  211. 1055  PRINT " " FN TM(I);" MIN.";:X$ =  STR$( FN TS(I)): IF  LEN(X$) <2  THEN X$ = "0" +X$
  212. 1060  PRINT X$;" SEC"
  213. 1065  IF CO/3 =  INT(CO/3)  THEN 1085
  214. 1070  NEXT 
  215. 1075  NEXT 
  216. 1080  PRINT C1$: VTAB 23: PRINT "PRESS ANY KEY TO RETURN TO MENU.";: GET YN$: PRINT : GOTO 110
  217. 1085  PRINT C1$: IF I = NU  THEN 1080
  218. 1090  VTAB 23: PRINT "PRESS <SPACE BAR> FOR MORE. <R> TO      RETURN TO MENU.";: GET YN$: PRINT : IF YN$ < >"R"  THEN  PRINT O1$: PRINT R1$;I: HOME : GOTO 1070
  219. 1093  GOTO 110
  220. 1095 ME$ =  LEFT$(RE$,1):LE$ =  MID$ (RE$,2,4):S =  VAL( MID$ (RE$,6,2)):AL$ =  MID$ (RE$,8,40):AR$ =  MID$ (RE$,48,30):TT =  VAL(LE$): RETURN 
  221. 1100  REM  SORT ROUTINE  SHELL/METZNER
  222. 1105  PRINT O2$: PRINT R2$;0: INPUT DR: PRINT C2$: PRINT O$: PRINT R$;0: INPUT XN: PRINT C$: IF XN -DR < = 1  THEN  TEXT : HOME : VTAB 12: PRINT "NOT ENOUGH RECORDS!": FOR I = 1 TO 3000: NEXT : RETURN 
  223. 1110  HOME : VTAB 10: PRINT "SORT BY:": VTAB 12: HTAB 3: PRINT  CHR$(91);"1] ARTIST": VTAB 14: HTAB 3: PRINT  CHR$(91);"2] TITLE": VTAB 10: HTAB 9
  224. 1115 I = 0
  225. 1120  GET YN$: PRINT : IF YN$ =  CHR$(13)  THEN 110
  226. 1125 YN =  VAL(YN$): IF YN <1  OR YN >2  THEN 1110
  227. 1130  HOME 
  228. 1135  IF YN = 1  THEN LO = 48:HI = 30: GOTO 1145
  229. 1140 LO = 8:HI = 40
  230. 1145  VTAB 12: PRINT "READING FILES": POKE 34,13
  231. 1150  PRINT O1$: PRINT O$: FOR CO = 1 TO XN: PRINT R1$;CO
  232. 1155 I = I +1
  233. 1160  INPUT RE$(CO): IF RE$(CO) = "0"  THEN I = I -1: GOTO 1170
  234. 1165 RE$(I) = RE$(CO): PRINT R$;CO: INPUT LN(I)
  235. 1170  NEXT : PRINT C1$: PRINT C$
  236. 1175 N = I: HOME : VTAB 12: PRINT "FILES BEING SORTED"
  237. 1180  GOSUB 1255
  238. 1185  HOME : VTAB 12: PRINT "WRITING SORTED FILES": POKE 34,13
  239. 1190  PRINT O1$: FOR I = 1 TO N: PRINT W1$;I: PRINT RE$(I): NEXT 
  240. 1195  IF N = XN  THEN  PRINT C1$: GOTO 1205
  241. 1200  FOR I = N +1 TO XN: PRINT W1$;I: PRINT 0: NEXT : PRINT C1$
  242. 1205  PRINT O$: FOR I = 1 TO XN: PRINT W$; VAL( RIGHT$(RE$(I), LEN(RE$(I)) -77)): PRINT I: NEXT : PRINT C$
  243. 1210  PRINT O2$: PRINT R2$;0: INPUT AR: IF AR = 0  THEN  PRINT : PRINT C2$: GOTO 1250
  244. 1215  FOR I = 1 TO AR *2
  245. 1220  INPUT AR(I)
  246. 1225  NEXT : PRINT C2$
  247. 1230  FOR I = 1 TO AR *2
  248. 1235  IF I/2 < > INT(I/2)  THEN AR(I) = N +1:N = N +1
  249. 1240  NEXT 
  250. 1245  PRINT O2$: PRINT W2$;0: PRINT AR: FOR I = 1 TO AR *2: PRINT AR(I): NEXT : PRINT C2$
  251. 1250  RETURN 
  252. 1255 K1 = N +1
  253. 1260 K1 =  INT(K1/2): IF K1 = 0  THEN 1295
  254. 1265 K2 = N -K1:J = 1
  255. 1270 I = J
  256. 1275 K3 = I +K1: IF  MID$ (RE$(I),LO,HI) < MID$ (RE$(K3),LO,HI)  THEN 1285
  257. 1280 K$ = RE$(I):RE$(I) = RE$(K3):RE$(K3) = K$:K4 = LN(I):LN(I) = LN(K3):LN(K3) = K4:I = I -K1: IF I >1  THEN 1275
  258. 1285 J = J +1: IF J >K2  THEN 1260
  259. 1290  GOTO 1270
  260. 1295  RETURN 
  261. 1300  REM  RECORDING CALCULATOR
  262. 1305 A$ = "RECORDING CALCULATOR": INVERSE : GOSUB 2090: NORMAL : POKE 34,1
  263. 1310  VTAB 12: INPUT "ENTER LENGTH OF TAPE (ONE SIDE) :";NO$:NO =  VAL(NO$)
  264. 1315  IF NO <1  OR NO >60  THEN  PRINT "ENTRY ERROR": FOR I = 1 TO 3000: NEXT : HOME : GOTO 1310
  265. 1320 N1 = NO *60: HOME : VTAB 1: PRINT "LEN.="NO
  266. 1325 S = S +1
  267. 1330  VTAB 21: INPUT "SONG TITLE:";ST$(S): IF  LEN(ST$(S)) >40  OR  LEN(ST$(S)) <1  THEN  HOME : GOTO 1330
  268. 1335  PRINT : INPUT "LENGTH (MIN,SEC) :";MI(S),SE(S): IF SE(S) >60  OR SE(S) <0  THEN  HOME : GOTO 1335
  269. 1340 N3 = N1
  270. 1345 N2 =  FN A(S):N1 = N1 -(N2 +5): REM  ADD 5 SEC. OF SILENCE BETWEEN SONGS
  271. 1350  IF N1 <0  THEN  VTAB 21: HOME : PRINT "NOT ENOUGH TIME REMAINING.": FOR I = 1 TO 3000: NEXT :S = S -1:N1 = N3: GOTO 1385
  272. 1355  VTAB S +2: PRINT S;") ";: PRINT  LEFT$(ST$(S),30);: PRINT  TAB( 35)MI(S);":";:X$ =  STR$(SE(S)): IF  LEN(X$) <2  THEN X$ = "0" +X$
  273. 1360  PRINT X$: POKE 34,S +3: HOME 
  274. 1365 MI =  INT(N1/60):SE = N1 - INT(N1/60) *60: VTAB 20: INVERSE : PRINT "TIME REMAINING: ";MI;":";:X$ =  STR$(SE): IF  LEN(X$) <2  THEN X$ = "0" +X$
  275. 1370  PRINT X$: POKE 34,20: HOME : NORMAL 
  276. 1375  IF MI = 0  AND SE = 0  THEN 1410
  277. 1380  IF S = 14  THEN 1410
  278. 1385  PRINT : PRINT "<A>DD ANOTHER SONG": PRINT "<S>EARCH FOR A SONG": PRINT "<Q>UIT"
  279. 1390 X =  PEEK( -16384): IF X = 193  THEN  POKE  -16368,0: HOME : GOTO 1325
  280. 1395  IF X = 211  THEN  POKE  -16368,0: HOME : GOTO 1465
  281. 1400  IF X = 209  THEN  POKE  -16368,0: GOTO 1410
  282. 1405  GOTO 1390
  283. 1410  HOME : VTAB 22: PRINT "DO YOU WANT TO MAKE THIS A PERMANENT    RECORD ?";: GET YN$: PRINT 
  284. 1415  HOME : IF YN$ = "N"  THEN 1455
  285. 1420  REM  MAKE FILE A PERMANENT RECORD
  286. 1425  GOSUB 1840:FL = 1: HOME : VTAB 21: GOSUB 140
  287. 1430  HOME : GOSUB 175: HOME : GOSUB 200
  288. 1435  IF AR < = 0  THEN NU = NU +1: GOTO 1445
  289. 1440 NU = AR(AR)
  290. 1445  FOR I = 1 TO S:LE = LE + FN A(I): NEXT 
  291. 1450  GOSUB 305
  292. 1455  TEXT : HOME : VTAB 12: PRINT "DO YOU WISH TO FORMAT ANOTHER TAPE ?";: GET YN$: PRINT : IF YN$ = "N"  THEN  RETURN 
  293. 1460 LE = 0:S = 0: HOME : GOTO 1300
  294. 1465  REM  SEARCH FOR SONG  FL=1 BY TITLE  FL=2 BY TIME
  295. 1470  HOME : VTAB 21: PRINT "SEARCH BY:": PRINT  TAB( 8)"1) SONG TITLE": PRINT  TAB( 8)"2) SONG LENGTH"
  296. 1475  VTAB 21: HTAB 11: GET YN$: PRINT : HOME :YN =  VAL(YN$): IF YN <1  OR YN >2  THEN 1470
  297. 1480  IF YN = 1  THEN FL = 1: VTAB 21: INPUT "TITLE :";S$: IF  LEN(S$) >40  OR  LEN(S$) <1  THEN  HOME : GOTO 1480
  298. 1485  IF FL = 1  THEN 1500
  299. 1490 FL = 2: INPUT "TIME (MIN,SEC) :";M,SS
  300. 1495  IF M <1  OR M >60  THEN  HOME : GOTO 1490
  301. 1500  HOME : VTAB 20: HTAB 30: FLASH : PRINT "SEARCHING": NORMAL 
  302. 1505  PRINT O$: PRINT R$;0: INPUT NU: PRINT C$
  303. 1510  FOR I = 1 TO NU: PRINT O2$: PRINT R2$;I
  304. 1515  INPUT AR$: IF AR$ = "0"  THEN 1560
  305. 1520  INPUT T
  306. 1525  FOR J = 1 TO T
  307. 1530  INPUT SO$(J),M(J),S(J)
  308. 1535  NEXT 
  309. 1540  FOR J = 1 TO T
  310. 1545  IF FL = 1  THEN  IF S$ =  LEFT$(SO$(J), LEN(S$))  THEN 1580
  311. 1550  IF FL = 2  THEN  IF M = M(J)  AND SS = S(J)  THEN 1580
  312. 1555  NEXT 
  313. 1560  NEXT : PRINT C2$: HOME 
  314. 1565  VTAB 20: HTAB 30: PRINT "         "
  315. 1570  IF CO = 0  THEN  VTAB 22: PRINT "SORRY! NO MATCH FOUND": FOR I = 1 TO 3000: NEXT :FL = 0: GOTO 1385
  316. 1575  VTAB 22: PRINT "THAT'S ALL OF THEM. NO MATCH FOUND.": FOR I = 1 TO 3000: NEXT :FL = 0: GOTO 1385
  317. 1580  VTAB 20: HTAB 30: PRINT "         ": HOME 
  318. 1585  PRINT C2$
  319. 1590  PRINT "TITLE : "; MID$ (SO$(J),1,31): PRINT "ARTIST :";AR$
  320. 1595  PRINT "LENGTH :";M(J);":";:X$ =  STR$(S(J)): IF  LEN(X$) <2  THEN X$ = "0" +X$
  321. 1600  PRINT X$: PRINT "IS THIS SONG ALRIGHT ?";: GET YN$: PRINT : IF YN$ = "Y"  THEN  HOME :S = S +1:ST$(8) = SO$(J):MI(S) = M(J):SE(S) = S(J):FL = 0: GOTO 1340
  322. 1605  HOME : VTAB 20: HTAB 30: FLASH : PRINT "SEARCHING": NORMAL : PRINT O2$: PRINT R2$;I: GOTO 1555
  323. 1610  VTAB 8: PRINT "SEARCH BY :": PRINT : PRINT "[1] ALBUM NAME": PRINT "[2] ARTIST NAME": PRINT "[3] SONG TITLE"
  324. 1615  VTAB 8: HTAB 12: GET YN$:YN =  VAL(YN$): IF YN <1  OR YN >3  THEN 1615
  325. 1620  IF YN = 3  THEN 1710
  326. 1625  IF YN = 1  THEN SW = 8:SW = 8:SL = 40: GOTO 1635
  327. 1630 SW = 48:SL = 30
  328. 1635  HOME : VTAB 12: PRINT "ENTER SEARCH KEY :";: INPUT "";S$: HOME 
  329. 1636  IF  LEN(S$) >SL  THEN 1635
  330. 1640  VTAB 12: PRINT "SEARCHING...": POKE 34,13
  331. 1645  PRINT O$: PRINT R$;0: INPUT NU: PRINT C$
  332. 1650  PRINT O1$
  333. 1655  FOR I = 1 TO NU
  334. 1660  PRINT R1$;I
  335. 1665  INPUT RE$: IF RE$ = "0"  THEN 1675
  336. 1670  IF  MID$ (RE$,SW, LEN(S$)) = S$  THEN  GOSUB 1915
  337. 1675  NEXT : PRINT C1$
  338. 1680  TEXT : HOME : VTAB 12: PRINT "SORRY. NO TITLE BY THAT NAME."
  339. 1685  PRINT : PRINT "PRESS <ESC> FOR ANOTHER SEARCH,<RETURN> TO GO BACK TO MENU."
  340. 1690 X =  PEEK( -16384)
  341. 1695  IF X = 141  THEN  POKE  -16368,0: GOTO 110
  342. 1700  IF X = 155  THEN  POKE  -16368,0: HOME : GOTO 480
  343. 1705  GOTO 1690
  344. 1710  REM  SEARCH FOR SONG  PART OF SEARCH/CHANGE/DELETE ROUTINE
  345. 1715  HOME : VTAB 12: INPUT "SONG TITLE: ";S$: IF S$ = ""  THEN  POP : GOTO 110
  346. 1716  IF  LEN(S$) >40  THEN 1715
  347. 1720  HOME : VTAB 12: PRINT "SEARCHING...": POKE 34,13
  348. 1725  PRINT O$: PRINT R$;0: INPUT NU: PRINT C$
  349. 1730  FOR I = 1 TO NU: PRINT O2$: PRINT R2$;I
  350. 1735  INPUT AR$: IF AR$ = "0"  THEN 1770
  351. 1740  INPUT S
  352. 1745  FOR J = 1 TO S
  353. 1750  INPUT ST$(J),MI(J),SE(J)
  354. 1755  NEXT 
  355. 1760  FOR J = 1 TO S: IF  LEN(S$) > LEN(ST$(J))  THEN 1765
  356. 1761  IF S$ =  LEFT$(ST$(J), LEN(S$))  THEN 1780
  357. 1765  NEXT 
  358. 1770  NEXT : PRINT C2$
  359. 1775  GOTO 1680: REM  : NO MATCH
  360. 1780  TEXT : HOME : VTAB 10: INVERSE : PRINT "SONG :";: NORMAL : PRINT " "ST$(J)
  361. 1785  INVERSE : PRINT "ARTIST :";: NORMAL : PRINT " ";AR$: PRINT 
  362. 1790  INVERSE : PRINT "LENGTH :";: NORMAL : PRINT " ";MI(J);" MIN.";:X$ =  STR$(SE(J)): IF  LEN(X$) <2  THEN X$ = "0" +X$
  363. 1795  PRINT " "X$;" SEC."
  364. 1800  PRINT C2$: VTAB 22: PRINT "IS THIS THE CORRECT SONG ?";: GET YN$: PRINT : IF YN$ = "N"  AND J <S  THEN 1810
  365. 1805  IF YN$ = "Y"  THEN 1815
  366. 1810  HOME : VTAB 12: PRINT "SEARCHING...": POKE 34,13: PRINT O2$: PRINT R2$;I: GOTO 1765
  367. 1815  POKE 34,23: HOME 
  368. 1820  PRINT O$: PRINT R$;I: INPUT AL: PRINT C$
  369. 1825 FI = I
  370. 1830  PRINT O1$: PRINT R1$;AL: INPUT RE$: PRINT C1$
  371. 1835  GOSUB 1935: RETURN 
  372. 1840  REM  CHECK FOR NEXT RECORD NUMBER
  373. 1845  PRINT O2$: PRINT R2$;0:: INPUT AR: IF AR = 0  THEN 1865
  374. 1850  FOR I = 1 TO AR *2
  375. 1855  INPUT AR(I)
  376. 1860  NEXT 
  377. 1865  PRINT C2$: IF AR >0  THEN  RETURN 
  378. 1870  PRINT O$: PRINT R$;0: INPUT NU: PRINT C$: RETURN 
  379. 1875  REM  LENGTHEN AR$,AL$,LE$
  380. 1880  FOR I = 1 TO 40:AL$ = AL$ +" ": IF  LEN(AL$) = 40  THEN I = 40: RETURN 
  381. 1885  NEXT : RETURN 
  382. 1890  FOR I = 1 TO 30:AR$ = AR$ +" ": IF  LEN(AR$) = 30  THEN I = 30: RETURN 
  383. 1895  NEXT : RETURN 
  384. 1900  FOR I = 1 TO 4 - LEN(LE$)
  385. 1905 LE$ = "0" +LE$
  386. 1910  NEXT : RETURN 
  387. 1915  PRINT C1$: TEXT 
  388. 1920  HOME : VTAB 10: PRINT "ALBUM NAME:": PRINT  MID$ (RE$,8,40): PRINT "ARTIST NAME:": PRINT  MID$ (RE$,48,30)
  389. 1925  VTAB  PEEK(37) +2: PRINT "IS THIS THE ENTRY THAT YOU WANT ?";: GET YN$: PRINT : IF YN$ = "Y"  THEN 1935
  390. 1930  HOME : VTAB 12: PRINT "SEARCHING...": POKE 34,13: PRINT O1$: PRINT R1$;I: RETURN 
  391. 1935 ME$ =  LEFT$(RE$,1):LE$ =  MID$ (RE$,2,4):S =  VAL( MID$ (RE$,6,2)):AL$ =  MID$ (RE$,8,40):AR$ =  MID$ (RE$,48,30):LN =  VAL( RIGHT$(RE$, LEN(RE$) -77))
  392. 1940 FI = LN:AL = I:TT =  VAL(LE$)
  393. 1945  PRINT O2$: PRINT R2$;LN: INPUT AR$: INPUT S: FOR I = 1 TO S: INPUT ST$(I),MI(I),SE(I): NEXT : PRINT C2$
  394. 1950  POP : RETURN 
  395. 1955  REM  TITLE PAGE
  396. 1960 : INVERSE : PRINT "'''''''''''''''''''''''''''''''''''''''''                                      ''                                      ''                                      '''''''''''''''''''''''''''''''''''''''''"
  397. 1965  VTAB 2:A$ = "MUSIC RETRIEVAL SYSTEM 3.0": GOSUB 2090
  398. 1970 A$ = "RUDY A. GUY      20-OCT-80": GOSUB 2090
  399. 1975 A$ = "(C) COPYRIGHT  1980": GOSUB 2090
  400. 1980  NORMAL 
  401. 1985  VTAB 8: PRINT "[1] ADD ALBUM": PRINT "[2] SEARCH, CHANGE, OR DELETE"
  402. 1990  PRINT "[3] LIST ENTRIES": PRINT "[4] SORT ENTRIES": PRINT "[5] COMPUTE RECORDING TIME": PRINT "[6] EXIT PROGRAM"
  403. 1995  PRINT : INVERSE : PRINT "SELECT ONE OF THE ABOVE :";: GET YN$: PRINT : NORMAL : IF YN$ <"1"  OR YN$ >"7"  THEN 1985
  404. 2000 YN =  VAL(YN$): HOME : RETURN 
  405. 2005  END 
  406. 2010  REM  ERROR ROUTINES
  407. 2015 ER =  PEEK(222):EL =  PEEK(218) + PEEK(219) *256
  408. 2020  IF ER = 5  AND EL = 1845  THEN  PRINT :EF = 1: PRINT W2$;0: PRINT 0: PRINT C2$: GOTO 1870
  409. 2025  IF ER = 5  AND EL = 1870  THEN  PRINT :EF = 1: PRINT W$;0: PRINT 0: PRINT C$: GOTO 125
  410. 2030  IF ER = 5  AND EL = 995  OR EL = 1515  OR EL = 1160  THEN  PRINT : PRINT C$: HOME : INVERSE : CALL  -211: VTAB ( PEEK(37) +1): PRINT " NO RECORDS IN FILE.": FOR I = 1 TO 2000: NEXT : NORMAL : GOTO 110
  411. 2035  IF ER = 9  THEN 2055
  412. 2040  IF ER = 255  THEN 45
  413. 2045  TEXT : HOME : PRINT "ERROR TYPE = ";ER: PRINT "LINE NUMBER = ";EL
  414. 2050  END 
  415. 2055  TEXT : HOME : VTAB 8: PRINT "SORRY! THIS DISK IS FULL. PLEASE REMOVE DISK FROM DRIVE AND REPLACE IT WITH A   FRESH, UNINITIALIZED DISK."
  416. 2060  PRINT : PRINT : INPUT "TYPE <INIT> TO INITIALIZE THE NEW DISK. (ANYTHING ELSE TO QUIT)                 ";YN$
  417. 2065  IF YN$ < >"INIT"  THEN  HOME : END 
  418. 2070  HOME : VTAB 12: PRINT "INITIALIZING NEW DISK. DO NOT INTERRUPT!"
  419. 2075  PRINT  CHR$(4);"INIT MUSIC RETRIEVAL SYSTEM"
  420. 2080  PRINT : PRINT "DONE": FOR I = 1 TO 3000: NEXT : GOTO 45
  421. 2085  REM  CENTERING ROUTINE
  422. 2090  HTAB 20 - LEN(A$)/2: PRINT A$: RETURN 
  423. 2095  DATA  ALBUM,8-TRACK,CASSETTE,REEL/REEL